import 'package:flutter/widgets.dart';
import 'package:get/get.dart';
import 'package:liuxlcommon/view/lxl_widget.dart';
import 'package:love_newf/app/com/http/http_request.dart';
import 'package:love_newf/app/com/manage/txim_manage/im_manage.dart';
import 'package:love_newf/app/com/model/friend_user_info_model.dart';
import 'package:love_newf/app/com/util/my_toast.dart';
import 'package:tencent_cloud_chat_sdk/enum/history_msg_get_type_enum.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_message.dart';
import 'package:tencent_cloud_chat_sdk/models/v2_tim_value_callback.dart';
import 'package:tencent_cloud_chat_sdk/tencent_im_sdk_plugin.dart';

class ChatLogic extends GetxController {
  ScrollController scrollController = ScrollController();

  late FriendUserInfoModel friendUserInfo;
  String message = "";
  int pageNum = 1;
  int pageSize = 20;
  int listType = 0;

  List<V2TimMessage>? datas;

  List<V2TimMessage>? showDatas;

  Future<List<V2TimMessage>?> getData() async {
    // 拉取单聊历史消息
    // 首次拉取，lastMsgID 设置为 null
    // 再次拉取时，lastMsgID 可以使用返回的消息列表中的最后一条消息的id
    V2TimValueCallback<List<V2TimMessage>> getHistoryMessageListRes =
        await TencentImSDKPlugin.v2TIMManager
            .getMessageManager()
            .getHistoryMessageList(
      getType: HistoryMsgGetTypeEnum.V2TIM_GET_LOCAL_OLDER_MSG,
      // 拉取消息的位置及方向
      userID: friendUserInfo.userId.toString(),
      // 用户id 拉取单聊消息，需要指定对方的 userID，此时 groupID 传空即可。
      // groupID: "groupID",
      // 群组id 拉取群聊消息，需要指定群聊的 groupID，此时 userID 传空即可。
      count: 500,
      // 拉取数据数量
      lastMsgID: null,
      // 拉取起始消息id
      // 仅能在群聊中使用该字段。
      // 设置 lastMsgSeq 作为拉取的起点，返回的消息列表中包含这条消息。
      // 如果同时指定了 lastMsg 和 lastMsgSeq，SDK 优先使用 lastMsg。
      // 如果均未指定 lastMsg 和 lastMsgSeq，拉取的起点取决于是否设置 getTimeBegin。设置了，则使用设置的范围作为起点；未设置，则使用最新消息作为起点。
      lastMsgSeq: -1,
      messageTypeList: [], // 用于过滤历史信息属性，若为空则拉取所有属性信息。
    );
    if (getHistoryMessageListRes.code != 0) {
      return datas;
    }
    var data = getHistoryMessageListRes.data;
    if (data == null) {
      pageSize = 1;
      return datas = null;
    }
    if (pageNum == 1) {
      datas = data;
    } else {
      datas?.addAll(data);
    }
    showDatas = datas?.reversed.toList();
    _scrollToBottom(anim: false);
    return datas;
  }

  sendMessage() {
    if (message.trim().isEmpty) {
      toastError("聊天信息不能为空！");
      return;
    }
    ImManage()
        .sendMessage(message.trim(), receiver: friendUserInfo.userId.toString())
        .then((item) {
      if (item != null) receiveMessage(item);
    });
    message = "";
    OldLInput.unfocus();
    update();
  }

  receiveMessage(V2TimMessage message) {
    datas?.insert(0, message);
    showDatas = datas?.reversed.toList();
    _scrollToBottom();
    update();
  }

  void _scrollToBottom({milliseconds, anim = true}) {
    Future.delayed(Duration(milliseconds: milliseconds ?? 100), () {
      if (scrollController.hasClients) {
        if (anim) {
          // 平滑滚动到底部，延时调整
          scrollController.animateTo(
            scrollController.position.maxScrollExtent,
            duration: const Duration(milliseconds: 300), // 设定动画持续时长
            curve: Curves.easeInOut, // 使用平滑的滚动曲线
          );
        } else {
          scrollController.jumpTo(scrollController.position.maxScrollExtent);
        }

        // 延迟少许时间再做一次小幅度滚动修正
        Future.delayed(Duration(milliseconds: 350), () {
          scrollController.jumpTo(
              scrollController.position.maxScrollExtent); // 使用 jumpTo 确保立即回到最底部
        });
      }
    });
  }
}
